package com.javabasic.net.NIO.buffer;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.nio.IntBuffer;
import java.nio.channels.FileChannel;
import java.util.Arrays;

/**
 * @author mir.xiong
 * @version 1.0
 * @description
 * @see
 * @since Created by work on 2022/6/4 01:44
 */
public class IntBufferDemo {

    public static void main(String[] args) throws InterruptedException {
        int[] intArray = new int[]{1,2,3,4,5};
        IntBuffer.wrap(intArray);

        IntBuffer intBuffer = IntBuffer.allocate(10);


        intBuffer.put(-1);

        intBuffer.put(intArray);

        System.out.println(intBuffer);
        intBuffer.flip();
        System.out.println(intBuffer.get());

        System.out.println(intBuffer);
        System.out.println(Arrays.toString(intBuffer.array()));


//        测试GC
//        System.gc();
//        Thread.sleep(5000);
    }

    /**
     * FileChannel.transferTo() 方法直接将当前通道内容传输到另一个通道，没有涉及到 Buffer 的任何操作，
     * NIO 中的 Buffer 是 JVM 堆或者堆外内存，但不论如何他们都是操作系统内核空间的内存。
     *
     * transferTo() 的实现方式就是通过系统调用 sendfile() (当然这是Linux中的系统调用)。
     * @param src
     * @param dest
     */
    public void zeroCopyFile(File src, File dest) {

        /**
         * 使用sendfile:读取磁盘文件，并网络发送
         * FileChannel sourceChannel = new RandomAccessFile(source, "rw").getChannel();
         * SocketChannel socketChannel = SocketChannel.open(sa);
         * sourceChannel.transferTo(0, sourceChannel.size(), socketChannel);
         */

        try (FileChannel srcChannel = new FileInputStream(src).getChannel();
             FileChannel destChannel = new FileInputStream(dest).getChannel()) {
            srcChannel.transferTo(0, srcChannel.size(), destChannel);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
